package com.still.springinactionlearning.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Date;

/**
 * @program: springinactionlearninf
 * @description: 提供日志增强功能
 * @author: jyxiao
 * @create: 2022-11-28 15:27
 **/
public class LogHandler implements InvocationHandler {
    /**
     * 被代理的对象，实际的方法执行者
     * 使用Object类型，可以代理任意的类对象
     */
    Object target;

    public LogHandler(Object target) {
        this.target = target;
    }

    /**
     * @param proxy 生成的代理类对象
     * @param method 被调用的方法
     * @param args 方法调用时传入的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(target, args);
        after();
        return result;
    }

    private void before() {
        System.out.println(String.format("log start time [%s]", new Date()));
    }

    private void after() {
        System.out.println(String.format("log end time [%s]", new Date()));
    }
}
